package cn.blnp.net.flowable.event.start.empty;

import lombok.extern.slf4j.Slf4j;
import org.flowable.engine.IdentityService;
import org.flowable.engine.RuntimeService;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;

/**
 * <h3>开始事件-空开始事件</h3>
 *
 * @author <a href="mailto:blnp.yibin@qq.com">lyb</a>
 * @version 1.0
 * @since 2025/5/7 10:13
 */
@Slf4j
@SpringBootTest
public class EmptyEventTest {

    @Resource
    private IdentityService identityService;
    @Resource
    private RuntimeService runtimeService;

    /**
     *  <p>
     *      空开始事件意味着没有指定启动流程实例的触发条件。它是最常见的一种开始事件，一般需要人工启动，或通过API触发。需要注意的是，在内嵌子流程中必须有空开始事件，因为子流程需要被主流程调用发起。
     *  </p>
     *  <pre>
     *      {@code
     *          <startEvent id="noStartEvent" name="NoStartEvent" flowable:initiator="INITIATOR"/>
     *      }
     *  </pre>
     *  <p>
     *      其中，initiator为可选属性，用于指定保存认证用户ID的变量名，在流程启动时，发起人ID会保存在这个变量中。上述配置中会将流程发起人ID保存在名称为INITIATOR的变量中。认证用户调用
     *   IdentityService. setAuthenticatedUserId(String)方法进行设置时，Flowable采用的是线程变量的方式，因此需要及时释放该变量。
     *  </p>
     **/
    @Test
    public void test() {
        try {
            identityService.setAuthenticatedUserId("admin");
            runtimeService.startProcessInstanceByKey("myProcessKey");
        } finally {
            identityService.setAuthenticatedUserId(null);
        }
    }
}
